package com.gali.leetcode.day21;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @Auther: gali
 * @Date: 2022-08-09 19:58
 * @Description:子集-----回溯
 */
public class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        backtrack(0,nums,list,new ArrayList<Integer>());
        return list;
    }

    private void backtrack(int i, int[] nums, List<List<Integer>> list, ArrayList<Integer> integers) {
        list.add(new ArrayList<>(integers));
        for (int j = i; j < nums.length ; j++) {
            integers.add(nums[j]);
            backtrack(j+1,nums,list,integers);
            integers.remove(integers.size()-1);
        }
    }


    /**
     * 单词搜索----回溯
     * @param board
     * @param word
     * @return
     */
    public boolean exist(char[][] board, String word) {
        int h = board.length, w = board[0].length;
        boolean[][] visited = new boolean[h][w];
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                boolean flag = check(board, visited, i, j, word, 0);
                if (flag) {
                    return true;
                }
            }
        }
        return false;
    }
    private boolean check(char[][] board, boolean[][] visited, int i, int j, String word, int i1) {
        if (board[i][j]!=word.charAt(i1)){
            return false;
        }else if (i1==word.length()-1){
            return true;
        }
        visited[i][j]=true;
        int[][] directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
        boolean result = false;
        for (int[] dir : directions) {
            int newi = i + dir[0], newj = j + dir[1];
            if (newi >= 0 && newi < board.length && newj >= 0 && newj < board[0].length) {
                if (!visited[newi][newj]) {
                    boolean flag = check(board, visited, newi, newj, word, i1 + 1);
                    if (flag) {
                        result = true;
                        break;
                    }
                }
            }
        }
        visited[i][j] = false;
        return result;
    }
}
